package clases.academico;

import CapaDatos.DataSource;
import CapaDatos.Sql;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class MateriaPeriodoCurso extends Materia {

    private int idmateriaperiodocurso;
    private DataSource dt;
    private String sql;

    public MateriaPeriodoCurso() {
        dt = new DataSource();

    }

    public int getIdmateriaperiodocurso() {
        return idmateriaperiodocurso;
    }

    public void setIdmateriaperiodocurso(int idmateriaperiodocurso) {
        this.idmateriaperiodocurso = idmateriaperiodocurso;
    }

    public void sacarIdMateriaPeriodoCurso(String materia, String curso) {
        sql = "SELECT IDMATERIAPERIODOCURSO FROM MATERIAPERIODOCURSO WHERE IDPERIODOCURSO \n"
                + "IN (SELECT IDPERIODOCURSO FROM PERIODOCURSO WHERE IDCURSO IN \n"
                + "(SELECT IDCURSO FROM CURSO JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "WHERE CONCAT(CURSO,' ',PARALELO)='" + curso + "') \n"
                + "AND IDPERIODO IN (SELECT IDPERIODO FROM PERIODO \n"
                + "WHERE ESTADO=TRUE)) \n"
                + "AND IDMATERIA IN (SELECT IDMATERIA \n"
                + "FROM MATERIA WHERE MATERIA='" + materia + "')";

        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            this.idmateriaperiodocurso = dt.getInt(1);
        }
    }

    public boolean guardarAsignacionMateria() {
        this.idmateriaperiodocurso = Sql.getMax("IDMATERIAPERIODOCURSO", "MATERIAPERIODOCURSO", true);
        sql = "INSERT INTO MATERIAPERIODOCURSO VALUES (" + this.idmateriaperiodocurso + ", "
                + this.curso.getIdcursoperiodo() + ", " + this.getIdmateria() + ")";
        return Sql.insertar(sql) == true;

    }

    public boolean QuitarAsignacion(String curso, String periodo, String materia) {
        sql = "SELECT * FROM MATERIADOCENTE WHERE IDMATERIAPERIODOCURSO \n"
                + "IN (SELECT IDMATERIAPERIODOCURSO FROM MATERIAPERIODOCURSO WHERE IDPERIODOCURSO \n"
                + "IN (SELECT IDPERIODOCURSO FROM PERIODOCURSO WHERE IDCURSO IN \n"
                + "(SELECT IDCURSO FROM CURSO JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "WHERE CONCAT(CURSO,' ',PARALELO)='" + curso + "') \n"
                + "AND IDPERIODO IN (SELECT IDPERIODO FROM PERIODO \n"
                + "WHERE PERIODO='" + periodo + "')) \n"
                + "AND IDMATERIA IN (SELECT IDMATERIA \n"
                + "FROM MATERIA WHERE MATERIA='" + materia + "') )";

        if (Sql.isExiste(sql) == true) {

            global.Mensajes.mostrarMensaje("Advertencia!", "La materia " + materia + " esta asignadas a un Docente... No se puede quitar", 3);
            return false;

        } else {
            return true;
        }
    }

    public boolean eliminarAsignacionMateria(String curso, String periodo, String materia) {
        sql = "DELETE FROM MATERIAPERIODOCURSO WHERE IDPERIODOCURSO \n"
                + "IN (SELECT IDPERIODOCURSO FROM PERIODOCURSO WHERE IDCURSO IN \n"
                + "(SELECT IDCURSO FROM CURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "WHERE CONCAT(CURSO,' ',PARALELO)='" + curso + "') \n"
                + "AND IDPERIODO IN (SELECT IDPERIODO FROM PERIODO \n"
                + "WHERE PERIODO='" + periodo + "'))\n"
                + "AND IDMATERIA IN (SELECT IDMATERIA "
                + "FROM MATERIA WHERE MATERIA='" + materia + "')";
        return Sql.eliminar(sql);

    }

    public boolean EliminarAsignacion(String curso, String periodo, String materia) {
        if (this.QuitarAsignacion(curso, periodo, materia) == false) {
            return false;
        } else if (global.Mensajes.mostrarPregunta("¿Realmente desea eliminar la asignación?") == true) {
            if (this.eliminarAsignacionMateria(curso, periodo, materia) == true) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    public boolean ExistenciaAsignacionMateria(String curso, String periodo, String materia) {
        sql = "SELECT * FROM MATERIAPERIODOCURSO WHERE IDPERIODOCURSO \n"
                + "IN (SELECT IDPERIODOCURSO FROM PERIODOCURSO WHERE IDCURSO IN \n"
                + "(SELECT IDCURSO FROM CURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "WHERE CONCAT(CURSO,' ',PARALELO)='" + curso + "') \n"
                + "AND IDPERIODO IN (SELECT IDPERIODO FROM PERIODO \n"
                + "WHERE PERIODO='" + periodo + "'))\n"
                + "AND IDMATERIA IN (SELECT IDMATERIA "
                + "FROM MATERIA WHERE MATERIA='" + materia + "')";

        return Sql.isExiste(sql);

    }

    public void SacarCursoAsiganado(JComboBox cbo, String curso) {

        sql = "SELECT  CONCAT(CURSO,' ',PARALELO) FROM CURSO "
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO "
                + "JOIN PERIODOCURSO ON PERIODOCURSO.IDCURSO=CURSO.IDCURSO "
                + "JOIN MATERIAPERIODOCURSO ON MATERIAPERIODOCURSO.IDPERIODOCURSO=PERIODOCURSO.IDPERIODOCURSO "
                + "JOIN MATERIA ON MATERIA.IDMATERIA=MATERIAPERIODOCURSO.IDMATERIA "
                + "WHERE MATERIA.IDMATERIA  IN "
                + "(SELECT IDMATERIA FROM MATERIAPERIODOCURSO "
                + "JOIN PERIODOCURSO ON MATERIAPERIODOCURSO.IDPERIODOCURSO=PERIODOCURSO.IDPERIODOCURSO "
                + "JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO "
                + "JOIN CURSO ON CURSO.IDCURSO=PERIODOCURSO.IDCURSO "
                + "JOIN PARALELO ON CURSO.IDPARALELO=CURSO.IDPARALELO "
                + "WHERE MATERIAPERIODOCURSO.IDMATERIA=MATERIA.IDMATERIA "
                + "AND ESTADO=TRUE) AND CONCAT(CURSO,' ',PARALELO)= '" + curso + "'";

        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            cbo.setSelectedItem(dt.getString(1));
        }
    }

    public void listaNoMateriaAsignada(JList lista, DefaultListModel modelo, String Curso, String periodo) {
        sql = "SELECT MATERIA FROM MATERIA WHERE IDMATERIA NOT IN (SELECT IDMATERIA \n"
                + "FROM MATERIAPERIODOCURSO WHERE IDPERIODOCURSO IN (SELECT IDPERIODOCURSO \n"
                + "FROM PERIODOCURSO JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO \n"
                + "JOIN CURSO ON CURSO.IDCURSO=PERIODOCURSO.IDCURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "WHERE CONCAT(CURSO,' ',PARALELO)='" + Curso + "' "
                + "AND PERIODO='" + periodo + "')) ORDER BY(MATERIA)";

        dt = new DataSource();
        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            modelo.addElement(dt.getString(1));
            lista.setModel(modelo);
        }
        lista.setSelectedIndex(0);
    }

    public void listaMateriaAsignada(JList lista, DefaultListModel modelo, String Curso, String periodo) {
        sql = "SELECT MATERIA FROM MATERIA WHERE IDMATERIA IN (SELECT IDMATERIA \n"
                + "FROM MATERIAPERIODOCURSO WHERE IDPERIODOCURSO IN (SELECT IDPERIODOCURSO \n"
                + "FROM PERIODOCURSO JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO \n"
                + "JOIN CURSO ON CURSO.IDCURSO=PERIODOCURSO.IDCURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "WHERE CONCAT(CURSO,' ',PARALELO)='" + Curso + "' "
                + "AND PERIODO='" + periodo + "')) ORDER BY(MATERIA)";

        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            modelo.addElement(dt.getString(1));
            lista.setModel(modelo);
        }
        lista.setSelectedIndex(0);
    }

    public void listarMateriaActivaCombo(JComboBox cbo) {
        cbo.removeAllItems();
        cbo.addItem("--Seleccione--");
        sql = "SELECT DISTINCT MATERIA FROM MATERIA WHERE IDMATERIA IN \n"
                + "(SELECT IDMATERIA FROM MATERIAPERIODOCURSO WHERE IDPERIODOCURSO IN (SELECT IDPERIODOCURSO \n"
                + "FROM PERIODOCURSO JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO \n"
                + "WHERE PERIODO.ESTADO=TRUE)) ORDER BY(MATERIA)";

        Sql.getConsulta(sql, dt);
        while (dt.next()) {
            cbo.addItem(dt.getString(1));
        }
        cbo.setSelectedIndex(0);

    }

    public String SqlMateriaCurso() {
        sql = "SELECT  CONCAT(CURSO,' ',PARALELO), CODIGO, MATERIA, PERIODO FROM CURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "JOIN PERIODOCURSO ON PERIODOCURSO.IDCURSO=CURSO.IDCURSO \n"
                + "JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO\n"
                + "JOIN MATERIAPERIODOCURSO ON MATERIAPERIODOCURSO.IDPERIODOCURSO=PERIODOCURSO.IDPERIODOCURSO \n"
                + "JOIN MATERIA ON MATERIA.IDMATERIA=MATERIAPERIODOCURSO.IDMATERIA "
                + "ORDER BY(CONCAT(CURSO,' ', PARALELO), MATERIA)";
        return sql;
    }

    public String SqlCodigoMateriaCurso(String codigo) {
        sql = "SELECT  CONCAT(CURSO,' ',PARALELO), CODIGO, MATERIA, PERIODO FROM CURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "JOIN PERIODOCURSO ON PERIODOCURSO.IDCURSO=CURSO.IDCURSO \n"
                + "JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO\n"
                + "JOIN MATERIAPERIODOCURSO ON MATERIAPERIODOCURSO.IDPERIODOCURSO=PERIODOCURSO.IDPERIODOCURSO \n"
                + "JOIN MATERIA ON MATERIA.IDMATERIA=MATERIAPERIODOCURSO.IDMATERIA "
                + "WHERE CODIGO LIKE ('" + codigo + "%') "
                + "ORDER BY(CONCAT(CURSO,' ', PARALELO), MATERIA)";
        return sql;
    }

    public String SqlMateriaMateriaCurso(String materia) {
        sql = "SELECT  CONCAT(CURSO,' ',PARALELO), CODIGO, MATERIA, PERIODO FROM CURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "JOIN PERIODOCURSO ON PERIODOCURSO.IDCURSO=CURSO.IDCURSO \n"
                + "JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO\n"
                + "JOIN MATERIAPERIODOCURSO ON MATERIAPERIODOCURSO.IDPERIODOCURSO=PERIODOCURSO.IDPERIODOCURSO \n"
                + "JOIN MATERIA ON MATERIA.IDMATERIA=MATERIAPERIODOCURSO.IDMATERIA  "
                + "WHERE MATERIA LIKE ('" + materia + "%') "
                + "ORDER BY(CONCAT(CURSO,' ', PARALELO), MATERIA)";
        return sql;
    }

    public String SqlCursoMateriaCurso(String curso) {
        sql = "SELECT  CONCAT(CURSO,' ',PARALELO), CODIGO, MATERIA, PERIODO FROM CURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "JOIN PERIODOCURSO ON PERIODOCURSO.IDCURSO=CURSO.IDCURSO \n"
                + "JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO\n"
                + "JOIN MATERIAPERIODOCURSO ON MATERIAPERIODOCURSO.IDPERIODOCURSO=PERIODOCURSO.IDPERIODOCURSO \n"
                + "JOIN MATERIA ON MATERIA.IDMATERIA=MATERIAPERIODOCURSO.IDMATERIA "
                + "WHERE CONCAT(CURSO,' ',PARALELO)= '" + curso + "' "
                + "ORDER BY(CONCAT(CURSO,' ', PARALELO), MATERIA)";
        return sql;
    }

    public String SqlPeriodoMateriaCurso(String periodo) {
        sql = "SELECT  CONCAT(CURSO,' ',PARALELO), CODIGO, MATERIA, PERIODO FROM CURSO \n"
                + "JOIN PARALELO ON PARALELO.IDPARALELO=CURSO.IDPARALELO \n"
                + "JOIN PERIODOCURSO ON PERIODOCURSO.IDCURSO=CURSO.IDCURSO \n"
                + "JOIN PERIODO ON PERIODO.IDPERIODO=PERIODOCURSO.IDPERIODO\n"
                + "JOIN MATERIAPERIODOCURSO ON MATERIAPERIODOCURSO.IDPERIODOCURSO=PERIODOCURSO.IDPERIODOCURSO \n"
                + "JOIN MATERIA ON MATERIA.IDMATERIA=MATERIAPERIODOCURSO.IDMATERIA "
                + "WHERE PERIODO= '" + periodo + "' "
                + "ORDER BY(CONCAT(CURSO,' ', PARALELO), MATERIA)";
        return sql;
    }

    public void ConsultaMateriaCurso(DefaultTableModel modelo, JTable tabla, String sql, JLabel Lpaginatotal, JLabel Lpagina, int pagina) {
        modelo = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int fila, int columna) {
                return false;
            }
        };
        tabla.setModel(modelo);
        modelo.addColumn("Nº");
        modelo.addColumn("CURSO");
        modelo.addColumn("CODIGO MATERIA");
        modelo.addColumn("MATERIA");
        modelo.addColumn("PERIODO LECTIVO");

        DefaultTableCellRenderer centrar = new DefaultTableCellRenderer();
        centrar.setHorizontalAlignment(SwingConstants.CENTER);
        tabla.getColumnModel().getColumn(0).setCellRenderer(centrar);
        TableColumn columna = new TableColumn();
        columna = tabla.getColumnModel().getColumn(0);
        columna.setPreferredWidth(20);
        columna = tabla.getColumnModel().getColumn(1);
        columna.setPreferredWidth(300);
        columna = tabla.getColumnModel().getColumn(2);
        columna.setPreferredWidth(60);
        columna = tabla.getColumnModel().getColumn(3);
        columna.setPreferredWidth(300);
        columna = tabla.getColumnModel().getColumn(4);
        columna.setPreferredWidth(300);

        sql = objPaginacion.getPaginacion(sql, pagina, 50);
        Sql.getConsulta(sql, dt);

        String[] fila;
        int n = (pagina * 50) - 49;
        while (dt.next()) {
            fila = new String[5];
            fila[0] = Integer.toString(n);
            fila[1] = dt.getString(1);
            fila[2] = dt.getString(2);
            fila[3] = dt.getString(3);
            fila[4] = dt.getString(4);
            modelo.addRow(fila);
            n++;
        }

        objPaginacion.actualPagina(Lpagina);
        objPaginacion.totalPaginas(Lpaginatotal);
        tabla.getSelectionModel().setSelectionInterval(0, 0);
    }

}
